var coding_debug = true; // debug
var tab_is_new = false;

var bms_formValidateOptions = null;

function setValidate(fromObj, options) {
	if (options) {
		bms_formValidateOptions = options;
		bms_formValidateOptions.errorElement = "span";
		bms_formValidateOptions.errorPlacement = function(error, element) {
			var s = element.parent().find("span[htmlFor='" + element.attr("id") + "']");
			if (s != null) {
				s.remove();
			}
			error.appendTo(element.parent().parent());
		};

		// 改由bmsAjaxForm中进行验证。不自动进行验证后提交
		bms_formValidateOptions.onsubmit = false;

		var validator = fromObj.validate(bms_formValidateOptions);
		validator.valid();

		$(fromObj[0]).on('valid.func', function() {
			return validator.valid();
		});
	}
}

function getBrowser() {
	var OsObject = "";
	var userAgent = navigator.userAgent;
	if (userAgent.indexOf('Opera') > -1) {
		return 'Opera';
	}

	if (userAgent.indexOf("Firefox") > -1) {
		return "Firefox";
	}

	if (userAgent.indexOf("Chrome") > -1) {
		return "Chrome";
	}

	if (userAgent.indexOf("Safari") > -1) {
		return "Safari";
	}
	if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1) {
		return "IE";
	}
}

window.onbeforeunload = function() {
	if (getBrowser() != 'Firefox') {
		if (window.top != window.self) {
			// 当检测到整个页面需要刷新时。不再刷新TAB页面
			if (!window.top.document.CLOSE_PAGE) {
				window.top.$.reload(window.self);
			}
		} else {
			showProccessBar();
			// 当整个页面进行刷新时。绑定一个CLOSE_PAGE属性，值为TRUE.
			window.top.document.CLOSE_PAGE = true;
		}
	}
}

function replaceDocument(url, responseText, newDoc, layer_index) {
	if (document.isDebug) {
		console.log('准备替换HTML Document内容 -> ' + url);
	}
	if (!newDoc) {
		newDoc = window.document;
	}

	var newDoc = newDoc.open("text/html", "replace");
	newDoc.write(responseText);
	newDoc.close();

	// HTML标签中加入当前页面的URI
	var htmlTags = newDoc.getElementsByTagName('html');
	if (htmlTags.length > 0) {
		htmlTags[0].setAttribute('uri', url);
		if (layer_index) {
			htmlTags[0].setAttribute('layer_index', layer_index);
		}
	}
	if (layer_index) {
		newDoc.LAYER_INDEX = layer_index;
	}
}

/**
 * 添加一个自定义函数 $.go ajax提交一个URL
 * 
 * $.submit ajax提交一个Form
 * 
 * $.stopQuickHit 禁止快速点击
 * 
 * $.reBindAjaxForm 重新绑定Form的ajax提交
 * 
 * $.reBindAjaxA 重新绑定a的ajax提交
 * 
 * @param $
 */
(function($) {
	/**
	 * JS中提交loction.href
	 */
	$.go = function(url, options) {
		var defaultOpt = {
			url : url,
			type : 'get',
			dataType : 'html'
		};
		$opt = $.extend({}, defaultOpt, options);
		return $.ajax($opt);
	}

	/**
	 * 重新载入指定window的内容
	 */
	$.reload = function(_window) {
		// 阻止_window窗口的重新载入
		if (!!(_window.attachEvent && !_window.opera)) {
			_window.document.execCommand("stop");
		} else {
			_window.stop();
		}

		// 使用ajax载入
		var LAYER_INDEX = _window.document.LAYER_INDEX;
		var uri = _window.document.getElementsByTagName('html')[0].getAttribute('uri');
		if (uri) {
			$.go(uri, {
				type : 'get',
				dataType : 'html',
				beforeSend : function() {
					showProccessBar();
				},
				success : function(data, textStatus, xhr) {
					replaceDocument(uri, data, _window.document, LAYER_INDEX);
				},
				error : function(xhr, textStatus, errorThrown) {
					setTimeout(function() {
						closeTab();
						hideProccessBar();
					}, 1500);
				}
			});
		}
	}

	/**
	 * JS中提交表单
	 */
	$.submit = function(form, options) {
		return bmsAjaxForm($(form), options);
	}

	/**
	 * 防止连点,间隔800毫秒
	 */
	$.stopQuickHit = function(e) {
		var $e = $(e);
		var isCommitted = $e.attr('isCommitted');
		if (isCommitted && isCommitted == 'isCommitted') {
			if (document.isDebug) {
				console.log('频繁点击,取消此次操作...');
			}
			return false;
		} else {
			$e.attr('isCommitted', 'isCommitted');
			setTimeout(function() {
				$e.removeAttr('isCommitted');
			}, 800);
		}
		return true;
	}

	/**
	 * 重新绑定form
	 */
	$.reBindAjaxForm = function() {
		$("form").unbind('submit', _form_bind_ajax);
		$("form").bind('submit', _form_bind_ajax);
	}

	/**
	 * 重新绑定a
	 */
	$.reBindAjaxA = function() {
		$("a").unbind('click', _a_bind_ajax);
		$("a").bind('click', _a_bind_ajax);
	}

})(jQuery);

var _form_bind_ajax = function(event) {
	if (document.isDebug) {
		console.log('检测到提交form表单');
	}
	var $form = $(this);

	bmsAjaxForm($form, {
		dataType : 'html',
		beforeSend : function() {
			showProccessBar();
		},
		success : function(data, textStatus) {
			if (document.isDebug) {
				console.log('检测到提交form表单成功,准备替换HTML');
			}
			replaceDocument($form.attr('action'), data);
		},
		error : function() {
			if (document.isDebug) {
				console.log('检测到提交form表单失败');
			}
			hideProccessBar();
		}
	});
	// 此处必须return false; 防止form重复提交
	return false;
}

var _a_bind_ajax = function(event) {
	var $a = $(this);

	// 设置了rel = 'prettyPhoto'属性的a标签，不再进行处理
	if ($a.attr('rel') == 'prettyPhoto') {
		return true;
	}

	var url = $(this).attr('href');
	// 如果是一个链接,则使用$.go执行。否则按正常执行
	if (isUrl(url)) {
		if ($a.attr('target') == '_blank') {
			window.open(url);
			return false;
		}

		if ($.stopQuickHit($a)) {
			if (document.isDebug) {
				console.log('点击了一个A标签 -> ' + $(this).html());
			}
			$.go(url, {
				dataType : 'html',
				beforeSend : function() {
					showProccessBar();
				},
				success : function(data, textStatus) {
					if (document.isDebug) {
						console.log('检测到提交a标签成功,准备替换HTML');
					}
					replaceDocument(url, data);
				},
				error : function() {
					if (document.isDebug) {
						console.log('检测到提交a标签失败');
					}
					hideProccessBar();
				}
			});
		}
		// 此处必须return false; 防止a重复提交
		return false;
	}
}

$(function() {
	$.fn.select2.defaults.set("language", "zh-CN");

	/**
	 * 多使用两层$(function(){}), 以防止动态加载的a标签不能绑定到该事件。具体请参见jquery中多层$(document).ready()的执行顺序。
	 */
	$(function() {
		$(function() {
			$.fn.select2.defaults.set("language", "zh-CN");

			// 阻止回车自动提交表单
			$("form").bind('keydown', function(event) {
				if (event.keyCode == 13)
					return false
			});
			
			// 覆盖form提交策略为ajax提交
			$("form").bind('submit', _form_bind_ajax);

			$("a").bind('click', _a_bind_ajax);
			
			hideProccessBar();
		});
	});
});

/**
 * 此方法如果重构，切记return false.不然会重复提交
 */
var bmsAjaxForm = function(formObj, options) {
	if (!$.stopQuickHit($(formObj))) {
		return false;
	}

	var validFunc = $(formObj[0]).trigger('valid.func');
	if (validFunc && !validFunc.valid()) {
		return false;
	}

	// 初始化
	options = options || {};

	var enctype;
	if (options.enctype) {
		enctype = options.enctype;
	} else {
		if (formObj.attr('enctype')) {
			enctype = formObj.attr('enctype');
		}
	}

	// 强制参数
	var mustOptions = {};
	if (enctype == 'multipart/form-data') {
		mustOptions = {
			contentType : false,
			processData : false,
			type : 'post'
		}
		options.data = new FormData(formObj[0]);
	} else {
		options.data = formObj.serialize();
	}

	// 默认参数
	var defaultOptions = {
		dataType : 'html',
		type : 'get'
	}

	// 检查是否传入URL地址
	if (!options.url) {
		var formAction = formObj.attr("action");
		if (!formAction) {
			formAction = document.location.pathname;
		}
		options.url = formAction;
	}

	// GET或者POST请求
	if (!options.type) {
		var actionMethod = formObj.attr("method");
		if (actionMethod) {
			options.type = actionMethod;
		}
	}
	// 数据
	var opt1 = $.extend({}, defaultOptions, options);
	var $option = $.extend({}, opt1, mustOptions);

	return $.ajax($option);
};

function isUrl(str) {
	if (!str || str.indexOf("javascript") == 0 || str.indexOf("#") == 0) {
		return false;
	}
	return true;
}